﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//赋值操作符
// =赋值   ==判断等于
//连续赋值，从右向左
//单目操作符：只有一个操作数
//双目操作符：+操作符（有来个操作数）
//0表示假，非0表示真
//sizeof是操作符不是函数（可放类型）
//~对一个数的二进制按位取反
// int a  = 3;
// int b = ~a;  ->b=-4
//00000000000000000000000000000011
//11111111111111111111111111111100（补码）
//11111111111111111111111111111011（反码）
//10000000000000000000000000000100（原码）-4

////00000000000000000000000000001101将第二个0改成1
//int main() {
//	int a = 13;
//	a |= (1 << 1);
//	printf("%d\n", a);//15
//	int b = 13;
//	b |= (1 << 4);
//	printf("%d\n", b);//29
//	//b &= ~(1 << 4);
//	b ^= (1 << 4);
//	printf("%d\n", b);//13
//	
//	return 0;
//}

//++前后置 --前后置
//int main() {
//	int a = 5;
//	printf("%d\n", a++);//5, a先打印后++
//	printf("%d\n", ++a);//7
//	return 0;
//}

//*解引用，找到指向的变量（指针运用）

//函数调用的括号是不可省略的
//sizeof是操作符可以省略

//只要是指针地址，其大小均是4或8字节（无论是char还是int）

//strlen函数，遇\0才停止，但不计算\0
//sizeof计算\0,有无\0对计算不影响
//int main() {
//	char ch[3] = { 0 };
//	char ch1[] = { 'b','i','t'};//无\0
//	char ch2[] = "bit";//有\0
//	int a = sizeof(ch);
//	int b = sizeof(ch1);
//	int c = sizeof(ch2);
//	printf("%d %d %d %d %d", a, b,c,strlen(ch1), strlen(ch2));
//	return 0;
//}

//关系操作符
//字符串的比较是比地址
//俩字符串比较相等应该使用strcmp

//逻辑操作符（只关注真假）
//逻辑与 && （可理解为并且，有一个为假，则为假）
//当第一个表达式为假时，第二个表达式是不会计算的
//逻辑或 || （或者，只要一个为真，则为真）
//当第一个表达式为真时，则后面的表达式不会计算

//三目操作符
//表达式1 ？ 表达式2 ： 表达式3
//（表达式1为真则计算表达式2，反之计算表达式3）
//从左向右计算
//int main() {
//	int a = 0;
//	int b = (a > 5 ?  3 :  -3);
//	printf("%d\n", b);
//	return 0;
//}
////求俩数最大值
//int main() {
//	int a = 0;
//	int b = 0;
//	scanf("%d%d", &a, &b);
//	printf("%d", (a > b ? a : b));
//	return 0;
//}

//逗号表达式
//从左向右计算，整个表达式的结果是最后一个表达式的结果
//表达式内的判断表达式无实际效果，不产生影响

//下标引用操作符：数组 [ ]
//arr[4] 可以写成 4[arr]  (定义不行，访问可以这样写)
//arr[7] --> *(arr+7) --> *(7+arr) --> 7[arr]
//arr是数组首元素的地址
//arr+7就是跳过7个元素，指向了第8个元素
// *（arr+7）就是第8个元素

//函数调用操作符  （）

//访问一个结构的成员的操作符
//箭头 ->    结构体指针->成员
//点 .       结构体对象.成员

//表达式求值
//由操作符优先级和结合性决定，有些操作数可能需要转换为其他类型
//整型提升：C语⾔中整型算术运算总是⾄少以缺省（默认）整型类型的精度来进⾏的。
//为了获得这个精度，表达式中的字符和短整型操作数在使⽤之前被转换为普通整型
//这种转换称为整型提升
//表达式中各种⻓度可能⼩于int⻓度的整型值，都必须先转换为
//int或unsigned int，然后才能送⼊CPU去执⾏运算。
//先进行整型提升为普通整型，再进行运算，结果将被截断，再存储至内存中
int main() {
	char c1 = 23;
	char c2 = 34;
	//00000000000000000000000000010111 ->23的补码
	//00000000000000000000000000100010 ->34的补码
//相加00000000000000000000000000111001 ->结果补码
	//截断 ->                 00111001
	//首位符号位是什么，前面就补什么
	printf("%d\n", c1 + c2);//57
	return 0;
}


